/**
 * 
 */
package talayaco.interfaz;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import talayaco.enums.EstadoAnimalEnum;
import talayaco.enums.TipoDietaEnum;
import talayaco.gestion.reports.GestionReporte;
import talayaco.gestion.reports.ReportData;
import talayaco.gui.ReporteAnimales;
import talayaco.gui.ReporteAnimalesHoteleriav2;
import talayaco.gui.ReporteDiagnostico;
import talayaco.gui.ReporteDietas;
import talayaco.gui.ReportePesajes;
import talayaco.gui.ReporteRodeoDeCria;
import talayaco.manager.GestionAlimentosMAN;
import talayaco.manager.GestionAnimalesMAN;
import talayaco.manager.GestionClientesMAN;
import talayaco.manager.GestionCorralesMAN;
import talayaco.manager.GestionProveedoresMAN;
import talayaco.manager.impl.GestionAlimentosMANimpl;
import talayaco.manager.impl.GestionAnimalesMANimpl;
import talayaco.manager.impl.GestionClientesMANimpl;
import talayaco.manager.impl.GestionCorralesMANimpl;
import talayaco.manager.impl.GestionProveedoresMANimpl;
import talayaco.utils.DateUtils;
import talayaco.utils.StringUtils;
import talayaco.vo.ClienteVO;
import talayaco.vo.CorralVO;
import talayaco.vo.DiagnosticoGeneralVO;
import talayaco.vo.ProveedorVO;
import talayaco.vo.ReporteAlimentoVO;
import talayaco.vo.ReporteAnimalVO;
import talayaco.vo.ReporteCantidadesConsumidasVO;
import talayaco.vo.ReporteHoteleriaVO;
import talayaco.vo.ReportePesajesVO;
import talayaco.vo.ReporteProporcionesVO;
import talayaco.vo.ReporteRecriaVO;

/**
 * @author Lucas
 * 
 */
public class GestionReportesINT {

	/**
	 * Manager de proveedor
	 */
	private static GestionProveedoresMAN gestionProveedoresMan = new GestionProveedoresMANimpl();

	/**
	 * Manager de clientes
	 */
	private static GestionClientesMAN gestionClientesMan = new GestionClientesMANimpl();

	/**
	 * Manager de alimentos
	 */
	private static GestionAlimentosMAN gestionAlimentosMan = new GestionAlimentosMANimpl();

	/**
	 * Manager de animales
	 */
	private static GestionAnimalesMAN gestionAnimalesMan = new GestionAnimalesMANimpl();

	/**
	 * Manager de animales
	 */
	private static GestionCorralesMAN gestionCorralesMan = new GestionCorralesMANimpl();

	/**
	 * Genera el reporte de proveedores
	 * 
	 * @throws Exception
	 */
	public static void abrirReporteProveedor() throws Exception {
		List<ProveedorVO> proveedoresVO = gestionProveedoresMan
				.getProveedoresVO();
		ReportData reportData = new ReportData();

		Map<String, String> parameters = new HashMap<String, String>();

		Calendar fecha = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fecha);
		parameters.put("fechaReporte", fechaReporte);

		reportData.setDataSource(new JRBeanCollectionDataSource(proveedoresVO));
		reportData.setParameters(parameters);
		reportData.setReportName("reporteProveedores.jasper");
		GestionReporte.generarReporte(reportData);

	}

	/**
	 * Genera el reporte de clientes
	 * 
	 * @throws Exception
	 */
	public static void abrirReporteClientes() throws Exception {
		List<ClienteVO> clientesVO = gestionClientesMan.getClientesVO();
		ReportData reportData = new ReportData();
		Map<String, String> parameters = new HashMap<String, String>();

		Calendar fecha = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fecha);
		parameters.put("fechaReporte", fechaReporte);

		reportData.setDataSource(new JRBeanCollectionDataSource(clientesVO));
		reportData.setParameters(parameters);
		reportData.setReportName("reporteClientes.jasper");
		GestionReporte.generarReporte(reportData);

	}

	/**
	 * Genera el reporte de alimentos
	 * 
	 * @throws Exception
	 */
	public static void abrirReporteAlimentos() throws Exception {
		List<ReporteAlimentoVO> reportesAlimentoVO = gestionAlimentosMan
				.getAlimentosCantidad();

		for (ReporteAlimentoVO reporteAlimentoVO : reportesAlimentoVO) {
			if (reporteAlimentoVO.getConsumoDiario().equals("0")) {
				reporteAlimentoVO.setConsumoDiario("No se usa actualmente");
				reporteAlimentoVO.setDiasRestantes("No se usa actualmente");
			}
		}

		ReportData reportData = new ReportData();
		Map<String, String> parameters = new HashMap<String, String>();

		Calendar fecha = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fecha);
		parameters.put("fechaReporte", fechaReporte);

		reportData.setDataSource(new JRBeanCollectionDataSource(
				reportesAlimentoVO));
		reportData.setParameters(parameters);
		reportData.setReportName("reporteAlimentos.jasper");
		GestionReporte.generarReporte(reportData);
	}

	/**
	 * Genera el reporte de animales
	 * 
	 * @throws Exception
	 */
	public static void abrirReporteAnimales(Map<String, String> datosConsulta,
			ReporteAnimales ventana) throws Exception {
		Map<String, Object> datosConsultaReporte = new HashMap<String, Object>(
				datosConsulta);

		Date fechaInicio = null;
		Date fechaFin = null;

		if (!datosConsulta.get("fechaInicio").equals("")
				&& !datosConsulta.get("fechaFin").equals("")) {
			fechaInicio = DateUtils.parse(datosConsulta.get("fechaInicio"),
					DateUtils.FORMAT_DDMMYYYY);
			fechaFin = DateUtils.parse(datosConsulta.get("fechaFin"),
					DateUtils.FORMAT_DDMMYYYY);
		}

		Calendar fecha = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fecha);
		datosConsulta.put("fechaReporte", fechaReporte);

		List<ReporteAnimalVO> reporteAnimalesVO = gestionAnimalesMan
				.getDatosReporteAnimal(datosConsultaReporte, fechaInicio,
						fechaFin);
		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(
				reporteAnimalesVO));
		reportData.setParameters(datosConsulta);
		reportData.setReportName("reporteAnimales.jasper");
		GestionReporte.generarReporte(reportData);
		ventana.dispose();
	}

	/**
	 * Genera el reporte de proporciones de alimentos
	 * 
	 * @param id
	 *            Id dieta
	 * @param tipoDieta
	 *            Tipo dieta
	 * @param fecha
	 *            Fecha elegida del combo
	 * @throws Exception
	 */
	public static void abrirReporteProporciones(String id, String tipoDieta,
			String fecha, ReporteDietas ventana) throws Exception {

		Map<String, String> params = new HashMap<String, String>();

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);
		params.put("fechaReporte", fechaReporte);

		String descripcionTipoDieta = TipoDietaEnum.valueOf(tipoDieta)
				.getDescripcion();
		params.put("vigencia", fecha);
		params.put("tipoDieta", descripcionTipoDieta);
		List<ReporteProporcionesVO> reporteAnimalesVO = gestionAlimentosMan
				.getProporcionesDieta(id, tipoDieta, params);
		List<ReporteProporcionesVO> reporteFinal = new ArrayList<ReporteProporcionesVO>();
		for (ReporteProporcionesVO reporteProporcionesVO : reporteAnimalesVO) {
			if (!reporteProporcionesVO.getProporcionReal().equals("0.00")) {
				reporteFinal.add(reporteProporcionesVO);
			}
		}

		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(reporteFinal));
		reportData.setParameters(params);
		reportData.setReportName("reporteProporciones.jasper");
		GestionReporte.generarReporte(reportData);
		ventana.dispose();
	}

	/**
	 * Genera el reporte de cantidades consumidas por animal de hoteleria
	 * 
	 * @param id
	 *            Id dieta
	 * @param tipoDieta
	 *            Tipo dieta
	 * @param fecha
	 *            Fecha elegida del combo
	 * @throws Exception
	 */
	public static void abrirReporteCantidadesConsumidas(
			List<ReporteCantidadesConsumidasVO> listaReporte,
			String fechaDesde, String fechaHasta, String cliente,
			ReporteAnimalesHoteleriav2 ventana) throws Exception {

		List<ReporteHoteleriaVO> reporteAnimalesFinal = new ArrayList<ReporteHoteleriaVO>();

		for (ReporteCantidadesConsumidasVO animalActual : listaReporte) {

			Date fechaDesdeDate = DateUtils.parse(animalActual.getFechaDesde(),
					DateUtils.FORMAT_DDMMYYYY);
			Date fechaHastaDate = DateUtils.parse(animalActual.getFechaHasta(),
					DateUtils.FORMAT_DDMMYYYY);

			List<ReporteHoteleriaVO> reporteAnimalesVO = gestionAlimentosMan
					.getReporteHoteleriaVO(animalActual.getCaravana(),
							fechaDesdeDate, fechaHastaDate);

			if (reporteAnimalesFinal.isEmpty()) {
				reporteAnimalesFinal = new ArrayList<ReporteHoteleriaVO>(
						reporteAnimalesVO);
			} else {
				for (ReporteHoteleriaVO valoresObtenidos : reporteAnimalesVO) {
					for (ReporteHoteleriaVO valoresFinales : reporteAnimalesFinal) {
						if (valoresObtenidos.getAlimento().equals(
								valoresFinales.getAlimento())) {
							valoresFinales.setCantidad(valoresFinales
									.getCantidad().add(
											valoresObtenidos.getCantidad()));
							break;
						}
					}
				}
			}
		}

		Map<String, String> params = new HashMap<String, String>();
		if (listaReporte.size() > 1) {
			params.put("caravana", "Todos");
			params.put("tipoAnimal", "Todos");

		} else {
			params.put("caravana", listaReporte.get(0).getCaravana());
			Map<String, String> animal = gestionAnimalesMan
					.getAnimalByCaravana(listaReporte.get(0).getCaravana());
			params.put("tipoAnimal", animal.get("tipoAnimal"));
		}

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);
		params.put("fechaReporte", fechaReporte);

		params.put("fechaDesde", fechaDesde);
		params.put("fechaHasta", fechaHasta);

		Date fechaDesdeDate = DateUtils.parse(fechaDesde,
				DateUtils.FORMAT_DDMMYYYY);
		Date fechaHastaDate = DateUtils.parse(fechaHasta,
				DateUtils.FORMAT_DDMMYYYY);

		String cantidadDias = ""
				+ (((((fechaHastaDate.getTime() - fechaDesdeDate.getTime()) / 1000) / 60) / 60) / 24);
		params.put("cantidadDias", cantidadDias);

		if (StringUtils.isNullOrBlank(cliente))
			params.put("cliente", gestionAnimalesMan
					.getClienteByCaravana(listaReporte.get(0).getCaravana()));
		else
			params.put("cliente", cliente);

		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(
				reporteAnimalesFinal));
		reportData.setParameters(params);
		reportData.setReportName("reporteHoteleria.jasper");
		GestionReporte.generarReporte(reportData);

		// ventana.dispose();
	}

	// /**
	// * Genera el reporte de cantidades consumidas por animal de hoteleria
	// *
	// * @param id
	// * Id dieta
	// * @param tipoDieta
	// * Tipo dieta
	// * @param fecha
	// * Fecha elegida del combo
	// * @throws Exception
	// */
	// public static void abrirReporteCantidadesConsumidasPorCliente(String
	// cliente,
	// String fechaDesde, String fechaHasta,
	// ReporteAnimalesHoteleriav2 ventana) throws Exception {
	//
	// Map<String, String> params = new HashMap<String, String>();
	// params.put("cliente", cliente);
	// params.put("fechaDesde", fechaDesde);
	// params.put("fechaHasta", fechaHasta);
	//
	// Date fechaDesdeDate = DateUtils.parse(fechaDesde,
	// DateUtils.FORMAT_DDMMYYYY);
	// Date fechaHastaDate = DateUtils.parse(fechaHasta,
	// DateUtils.FORMAT_DDMMYYYY);
	//
	// List<ReporteHoteleriaVO> reporteAnimalesVO = gestionAlimentosMan
	// .getReporteHoteleriaClienteVO(cliente, fechaDesdeDate, fechaHastaDate);
	// ReportData reportData = new ReportData();
	// reportData.setDataSource(new JRBeanCollectionDataSource(
	// reporteAnimalesVO));
	// reportData.setParameters(params);
	// reportData.setReportName("reporteHoteleria.jasper");
	// GestionReporte.generarReporte(reportData);
	//
	// ventana.dispose();
	// }

	/**
	 * Genera el reporte de corrales
	 * 
	 * @throws Exception
	 */
	public static void abrirReporteCorrales() throws Exception {
		List<CorralVO> reporteAlimentoVO = gestionCorralesMan
				.getReporteCorrales();
		ReportData reportData = new ReportData();
		Map<String, String> parameters = new HashMap<String, String>();

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);
		parameters.put("fechaReporte", fechaReporte);

		reportData.setDataSource(new JRBeanCollectionDataSource(
				reporteAlimentoVO));
		reportData.setParameters(parameters);
		reportData.setReportName("reporteCorrales.jasper");
		GestionReporte.generarReporte(reportData);
	}

	/**
	 * Genera el reporte de pesajes.
	 * 
	 * @param id
	 *            Nombre Corral
	 * @param fechaDesde
	 *            Fecha deste
	 * @param fechaHasta
	 *            Fecha hasta
	 * @throws Exception
	 */
	public static void abrirReportePesajes(String nombre, String fechaDesde,
			String fechaHasta, ReportePesajes ventana) throws Exception {

		Map<String, String> params = new HashMap<String, String>();
		params.put("nombre", nombre);
		params.put("fechaDesde", fechaDesde);
		params.put("fechaHasta", fechaHasta);

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);
		params.put("fechaReporte", fechaReporte);

		Date fechaDesdeDate = DateUtils.parse(fechaDesde,
				DateUtils.FORMAT_DDMMYYYY);
		Date fechaHastaDate = DateUtils.parse(fechaHasta,
				DateUtils.FORMAT_DDMMYYYY);

		List<ReportePesajesVO> reportePesajesVO = gestionCorralesMan
				.getReportePesajes(nombre, fechaDesdeDate, fechaHastaDate);
		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(
				reportePesajesVO));
		reportData.setParameters(params);
		reportData.setReportName("reportePesajes.jasper");
		GestionReporte.generarReporte(reportData);
		ventana.dispose();
	}

	/**
	 * Genera el reporte de pesajes.
	 * 
	 * @param id
	 *            Nombre Corral
	 * @param fechaDesde
	 *            Fecha deste
	 * @param fechaHasta
	 *            Fecha hasta
	 * @throws Exception
	 */
	public static void abrirReporteRecria(String tipoCaravana, String caravana,
			String estado, String fechaDesdeParto, String fechaHastaParto,
			ReporteRodeoDeCria reporteRodeoDeCria) throws Exception {

		System.out.println(tipoCaravana + " - " + caravana + " - " + estado
				+ " - " + fechaDesdeParto + " - " + fechaHastaParto);

		// Cambiar la ventana
		Map<String, String> params = new HashMap<String, String>();
		params.put("tipoCaravana", tipoCaravana);
		params.put("caravana", caravana);
		if (estado != null)
			params.put("estado", EstadoAnimalEnum.getId(estado));
		else
			params.put("estado", null);
		params.put("fechaDesdeParto", fechaDesdeParto);
		params.put("fechaHastaParto", fechaHastaParto);

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);

		List<ReporteRecriaVO> reportePesajesVO = gestionAnimalesMan
				.getReporteRecria(params);

		params.put("fechaReporte", fechaReporte);

		if (tipoCaravana == null) {
			params.put("tipoCaravana", "-");
		}

		if (caravana == null) {
			params.put("caravana", "-");

		}

		if (estado == null) {
			params.put("estado", "-");

		} else {
			params.put("estado", estado);

		}

		if (fechaDesdeParto == null) {
			params.put("fechaDesdeParto", "-");

		}

		if (fechaHastaParto == null) {
			params.put("fechaHastaParto", "-");

		}

		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(
				reportePesajesVO));
		reportData.setParameters(params);
		reportData.setReportName("reporteRecria.jasper");
		GestionReporte.generarReporte(reportData);
		// reporteRodeoDeCria.dispose();
	}

	/**
	 * Genera el reporte de pesajes.
	 * 
	 * @param id
	 *            Nombre Corral
	 * @param fechaDesde
	 *            Fecha deste
	 * @param fechaHasta
	 *            Fecha hasta
	 * @throws Exception
	 */
	public static void abrirReporteDiagnosticoGeneral()
			throws Exception {

		Map<String, String> params = new HashMap<String, String>();

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);
		params.put("fechaReporte", fechaReporte);

		List<DiagnosticoGeneralVO> reporteDiagnosticoVO = gestionAnimalesMan
				.abrirReporteDiagnosticoGeneral();
		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(
				reporteDiagnosticoVO));
		reportData.setParameters(params);
		reportData.setReportName("reporteDiagnosticoGeneral.jasper");
		GestionReporte.generarReporte(reportData);
	}

	/**
	 * Genera el reporte de pesajes.
	 * 
	 * @param id
	 *            Nombre Corral
	 * @param fechaDesde
	 *            Fecha deste
	 * @param fechaHasta
	 *            Fecha hasta
	 * @throws Exception
	 */
	public static void abrirReporteDiagnostico(String caravana,
			ReporteDiagnostico reporteDiagnostico) throws Exception {

		Map<String, String> params = new HashMap<String, String>();

		Calendar fechaActual = Calendar.getInstance();
		String fechaReporte = DateUtils.getFechaEnLetras(fechaActual);
		params.put("fechaReporte", fechaReporte);
		params.put("caravana", caravana);
		params.put(
				"tipoAnimal",
				gestionAnimalesMan.getAnimalByCaravana(caravana).get(
						"tipoAnimal"));

		List<DiagnosticoGeneralVO> reporteDiagnosticoVO = gestionAnimalesMan
				.abrirReporteDiagnosticoByCaravana(caravana);
		ReportData reportData = new ReportData();
		reportData.setDataSource(new JRBeanCollectionDataSource(
				reporteDiagnosticoVO));
		reportData.setParameters(params);
		reportData.setReportName("reporteDiagnostico.jasper");
		GestionReporte.generarReporte(reportData);
		reporteDiagnostico.dispose();
	}
}
